﻿#ifndef PM511PF_H
#define PM511PF_H

#ifdef PM5002K_EXPORTS
#define ZT_API _declspec(dllexport)
#else
#define ZT_API _declspec(dllimport)

//定义错误号
#define ZT_SUCCESS 0  //无错误
#define ERR_PARAMETER1 1 //参数1错
#define ERR_PARAMETER2 2 //参数2错
#define ERR_PARAMETER3 3 //参数3错
#define ERR_PARAMETER4 4 //参数4错
#define ERR_PARAMETER5 5 //参数5错
#define ERR_PARAMETER6 6 //参数6错
#define ERR_PARAMETER7 7 //参数7错
#define ERR_PARAMETER8 8 //参数8错
#define ERR_PARAMETER9 9 //参数9错
#define ERR_PARAMETER10 10 //参数10错
#define ERR_PARAMETER11 11 //参数11错
#define ERR_PARAMETER12 12 //参数12错
#define ERR_PARAMETER13 13 //参数13错
#define ERR_PARAMETER14 14 //参数14错
#define ERR_PARAMETER15 15 //参数15错
#define ERR_PARAMETER16 16 //参数16错
#define ERR_PARAMETER17 17 //参数17错
#define ERR_PARAMETER18 18 //参数18错
#define ERR_PARAMETER19 19 //参数19错
#define ERR_PARAMETER20 20 //参数20错
#define ERR_PARAMETER_BASEADDR 21 //针对ISA卡，板卡基地址超出范围，应该在0x100至0x3F0之间未被系统占用的地址
#define ERR_PARAMETER_CARDNO 22 //针对PCI卡，板卡索引号超出范围，这版驱动中板卡索引号从1开始
#define ERR_PARAMETER_CHMODE 23 //通道方式参数错误，通道方式超出范围，一般只有0--3共4种方式
#define ERR_PARAMETER_CH 24 //通道号参数错误，通道号超出范围
#define ERR_PARAMETER_CHIP 25 //芯片号参数错误，芯片号超出范围
#define ERR_PARAMETER_PORT 26 //口号参数错误，口号超出范围
#define ERR_PARAMETER_AI_RANGE 27 //AD量程参数错，此卡不支持这种AD输入量程
#define ERR_PARAMETER_AI_AMP 28 //AD增益参数错
#define ERR_PARAMETER_AI_STARTMODE 29 //AD启动方式参数错
#define ERR_PARAMETER_AO_RANGE 30 //DA量程参数错，此卡不支持这种DA输出量程
#define ERR_PARAMETER_ADFREQ 31 //AD采集频率(或AD分频系数)参数错
#define ERR_PARAMETER_IRQ 32 //与中断相关参数错，可能是此卡不支持这种中断方式或中断号
#define ERR_PARAMETER_NULL_POINTER 33 //空指针错。原因：缓冲区首地址为空或者用户传入的参数导致引用到空指针
#define ERR_AD_OVERTIME 34 //AD超时。对于ISA卡，出错原因可能是：未插卡或IO地址与板卡上设置不匹配。当用定时启动AD或外触发启动AD时，一般不应检查AD是否超时
#define ERR_OPEN_DEVICE 35 //打开设备失败，对于PCI卡，出错原因可能是：未插卡或未装驱动
#define ERR_CLOSE_DEVICE 36 //关闭设备失败
#define ERR_TIMING 37 //定时未到或外触发脉冲未到
#define ERR_IOADDR_DA_OVERTIME 38 //带光隔DA写过程超时
#define ERR_OPEN_IRQ 39 //打开中断出错
#define ERR_FUNC_CANNT_RUN 40 //此函数不能在这台计算机上运行
#define ERR_ASYNC_FUNC_FAILED 41 //异步函数调用失败
#define ERR_FUNC_OPERATE 42 //在当前的卡的设置状态下，不应该调用此函数
#define ERR_EXCHANGE_DATA 43 //与底层驱动之间交换数据出错
#endif


extern "C" 
{
  ZT_API unsigned long _stdcall ZT511PF_GetLastErr();
  //函数名称：ZT511PF_GetLastErr
  //函数功能：得到当前错误号。如果错误号为0表示无错误
  //返回值：错误代码，错误代码含义请看宏定义
  ZT_API void _stdcall ZT511PF_ClearLastErr();
  //函数名称：ZT511PF_ClearLastErr
  //函数功能：清除错误号。
  //          注意：一旦产生错误，为了使函数重新正常执行，必须清除错误号
  //返回值：无
  ZT_API void _stdcall ZT511PF_SetBaseNO(unsigned long baseNO);
  //函数名称：ZT511PF_SetBaseNO
  //函数功能：设置板卡索引号(cardNO)，芯片号(chipNO)，口号(portNO)和通道号(chNO)，
  //          总之带“NO”后缀的参数是从0开始还是从1开始。默认为从1开始
  //          建议不要调用这个函数
  //入口参数：
  //          baseNO：只能设为0或1
  //返回值：无
  ZT_API long _stdcall ZT511PF_GetBaseNO();
  //函数名称：ZT511PF_GetBaseNO
  //函数功能：返回当前板卡索引号(cardNO)，芯片号(chipNO)，口号(portNO)和通道号(chNO)，
  //          总之带“NO”后缀的参数是从0开始还是从1开始。默认为从1开始
  //返回值：返回0  表从0开始
  //        返回1  表从1开始
  ZT_API long _stdcall ZT511PF_OpenDevice(unsigned long baseAddr);
  //函数名称：ZT511PF_OpenDevice
  //函数功能：打开设备(其实是打开服务)。必须在调用其他函数之前调用。
  //          放在程序初始化时调用比较恰当，只调用一次即可
  //          提示：因为没有实际操纵板卡，所以不管机器上有没有插卡，
  //                只要安装了驱动中带的系统服务，这个函数都能正常运行。
  //          注意：当调用此函数成功后，还要调用 ZT511PF_GetCardNO 函数得到板卡号，
  //                因为调用其他函数时，需要用到板卡号，板卡号默认从 1 开始
  //入口参数：
  //          baseAddr：板卡基地址，必须在0x100至0x3F0之间且必须与硬件跳线相一致。
  //                    习惯上地址用十六进制表示，例如：VC下用 0x100，VB下用 &H100，Delphi下用 $100
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_GetCardNO(unsigned long baseAddr);
  //函数名称：ZT511PF_GetCardNO
  //函数功能：根据板卡基地址得到板卡号。
  //          通过基地址打开板卡后，调用其他函数时，需要用到板卡号
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //
  //返回值：  大于0  表示返回板卡的基地址
  //            -1   表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_CloseDevice(unsigned long cardNO);
  //函数名称：ZT511PF_CloseDevice
  //函数功能：关闭指定的设备(其实是关闭服务句柄)。
  //          必须在用户程序结束之前调用一次，否则下次进入用户程序调用ZT511PF_OpenDevice时，有时会失败。
  //          提示：
  //                1. 因为没有实际操纵板卡，所以不管机器上有没有插卡，
  //                   只要安装了驱动中带的系统服务，这个函数都能正常运行。
  //                2. 在程序退出前可调用 ZT511PF_CloseAllDevice 关闭所有设备(服务句柄)
  //
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_CloseAllDevice();
  //函数名称：ZT511PF_CloseAllDevice
  //函数功能：关闭当前进程中打开的所有相同型号的设备
  //入口参数：
  //          无
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_GetBaseAddr(unsigned long cardNO);
  //函数名称：ZT511PF_GetBaseAddr
  //函数功能：根据板卡号得到板卡的基地址。
  //          在2K或XP下用户不能用得到的基地址直接访问端口
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //
  //返回值：  大于0  表示返回板卡的基地址
  //            -1   表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_GetCardCount();
  //函数名称：ZT511PF_GetCardCount
  //函数功能：得到当前进程中已经打开的这种型号的板卡的数量。
  //          
  //入口参数：无
  //返回值： >=0  表示系统中已识别的这种型号的板卡的数量。
  ZT_API unsigned char _stdcall ZT511PF_ReadB(unsigned long cardNO,
                                              unsigned long nOffset);
  //函数名称：ZT511PF_ReadB
  //函数功能：以IO方式，对板卡寄存器进行8位读
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //         nOffset：偏移地址，在硬件说明书上可以查到
  //返回值：  返回大于等于0的数，表读出的具体值
  //          -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API unsigned short _stdcall ZT511PF_ReadW(unsigned long cardNO,
                                               unsigned long nOffset);
  //函数名称：ZT511PF_ReadW
  //函数功能：以IO方式，对板卡寄存器进行16位读
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //         nOffset：偏移地址，在硬件说明书上可以查到
  //返回值：  返回大于等于0的数，表读出的具体值
  //          -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_WriteB(unsigned long cardNO, 
                                      unsigned long nOffset,
                                      unsigned long dataByte);
  //函数名称：ZT511PF_WriteB
  //函数功能：以IO方式，对板卡寄存器进行8位写
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //         nOffset：偏移地址，在硬件说明书上可以查到
  //        dataByte：要写入寄存的值
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_WriteW(unsigned long cardNO,
                                      unsigned long nOffset,
                                      unsigned long dataWord);
  //函数名称：ZT511PF_WriteW
  //函数功能：以IO方式，对板卡寄存器进行16位写
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //         nOffset：偏移地址，在硬件说明书上可以查到
  //        dataWord：要写入寄存的值
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_AIinit(unsigned long cardNO,
                                      unsigned long chMode,
                                      unsigned long chNO,
                                      unsigned long AIRange,
                                      unsigned long AIAmp,
                                      unsigned long ADstartMode,
                                      unsigned long ADfreq,
                                      unsigned long IrqMask,
                                      unsigned long ADctrlWord,
                                      unsigned long ADoverTime);
  //函数名称：ZT511PF_AIinit
  //函数功能：设置AD方式控制寄存器，一般不要调用 _WRITE 直接写入AD方式控制字
  //
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chMode：通道方式
  //                    0 = 表示单端，固定单通道方式
  //                    1 = 表示单端，多通道扫描方式
  //                    2 = 表示双端，固定单通道方式
  //                    3 = 表示双端，多通道扫描方式
  //            chNO：通道号或多通道循环输出中止通道号
  //                    当chMode = 0 时，为通道号(1--16)
  //                    当chMode = 1 时，为多通道循环采集中止通道号(1-16)，例如设为2表示，采集的顺序为：通道1,通道2,通道1,通道2......
  //                    当chMode = 2 时，为通道号(1--8)
  //                    当chMode = 3 时，为多通道循环采集中止通道号(1-8)，例如设为2表示，采集的顺序为：通道1,通道2,通道1,通道2......
  //         AIRange：选择对采集到的AD原码值做何种变换，应该与AD采集量程(一般需跳线)相匹配：
  //                    AIRange = 0，表示返回原码(0-4095)，所有卡都有这种方式
  //                    AIRange = 2，表示把原码值转化为 0 -- 10000mV 之间的值，如果此卡没有这种量程，不应选这种方式
  //                    AIRange = 5，表示把原码值转化为 -5000 -- 5000mV 之间的值，如果此卡没有这种量程，不应选这种方式
  //                    AIRange = 6，表示把原码值转化为 -10000 -- 10000mV 之间的值，如果此卡没有这种量程，不应选这种方式
  //           AIAmp：保留。保持此参数为0
  //     ADstartMode：AD启动方式，有下面几种
  //                     0 软件启动AD
  //                     1 定时启动AD方式
  //                         这种方式是对板上自带的4M时钟进行分频，用分频后的时钟信号
  //                         定时触发AD，实际上也可以认为是外触发，只不过触发信号
  //                         由板上时钟提供。
  //                     2 外同步时钟启动AD方式
  //                         用户不用板上的时钟，而是自行提供触发信号接到板上J3接口的EIN端，
  //                         并且要保证两次触发AD的间隔不应小于1/100K秒
  //                     3 单次外触发信号使能定时AD方式
  //                         表示板卡接到一个外触发信号后，按照定时方式开始AD采集
  //                     注意：软件启动AD方式时，不用FIFO；
  //                           其他方式时，都要用到FIFO
  //          ADfreq：当 ADstartMode=1或ADstartMode=3 时，指定采样频率，其他AD方式时，一般保持此参数为0
  //                     板上自带的时钟默认为200K，实际是对这个时钟设置分频系数1~4095，分频后的时钟
  //                     用于定时启动AD。
  //                     公式：采样频率= 200K/(ADfreq+1)
  //                     例如：ADfreq=1时，  采样频率 = 200K/(1+1) = 100KHz
  //                           ADfreq=4095时，采样频率 = 200K/(4095+1) 约= 48Hz
  //                     注意：1. 如果需要更低的采样频率，请用“外同步时钟启动AD方式”，
  //                              外同步时钟也可通过用板上8254对板上时钟再次分频而获得
  //                           2. 当用多通道扫描方式时，每个通道的采集频率 = 采样频率 / 通道数
  //         IrqMask：设置可产生哪些硬件中断。一般设为 8 即可
  //                    1 = 外触发中断有效。当外触发信号频率高于1K，建议不要开此中断
  //                    2 = AD转换结束中断。当AD转换结束信号频率高于1K，建议不要开此中断
  //                    4 = 定时中断。当定时时钟(由板上4M时钟分频得到的信号)频率高于1K，建议不要开此中断
  //                    8 = 硬件缓冲区(HFIFO)半满中断有效
  //      ADctrlWord：一般保持此参数为0。
  //                    若此参数不为0，函数将直接用这个参数的值设置AD控制寄存器(基地址+1)的值，
  //                    而对其他影响AD控制寄存器的参数(例如ADstartMode)的值不予考虑。
  //      ADoverTime：为0表不判断超时。一般保持这个参数为0
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_AI(unsigned long cardNO,
                                  short *pResultArr,
                                  unsigned long wantReadCount);
  //函数名称：ZT511PF_AI
  //函数功能：软件启动AD，采一批数，然后根据先前调用 ZT511PF_AIinit 函数时
  //          设置的 AIRange 参数，把读到的结果转化到用户指定的量程上。
  //
  //          注意：1. 需要先调用 ZT511PF_AIinit 做一些初始化工作
  //                2. 软件启动AD方式，既不是从HFIFO中也不是从SFIFO中读数。
  //                   这个函数一般只在调零调满时才用。
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //      pResultArr：用户必须申请一个至少含有 wantReadCount 个 short 型元素的缓冲区，
  //                    用于存放采集结果，而 pResultArr 是这个缓冲区的首地址。
  //   wantReadCount：用户希望读出的数据个数，必须>0，且不能超过用户缓冲区的实际大小
  //                    
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_AIonce(unsigned long cardNO,
                                      unsigned long chMode,
                                      unsigned long chNO,
                                      unsigned long AIRange,
                                      unsigned long AIAmp,
                                      unsigned long ADoverTime);
  //函数名称：ZT511PF_AIonce
  //函数功能：软件启动AD方式下，多个通道并行AD采集一次。不需要先调用 ZT511PF_AIinit
  //          注意：软件启动AD方式，既不是从HFIFO中也不是从SFIFO中读数。
  //                这个函数一般只在调零调满时才用。
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chMode：通道方式
  //                    0 = 表示单端，固定单通道方式
  //                    2 = 表示双端，固定单通道方式
  //            chNO：通道号
  //                    当chMode = 0 时，为通道号(1--16)
  //                    当chMode = 2 时，为通道号(1--8)
  //         AIRange：选择对采集到的AD原码值做何种变换，应该与AD采集量程(一般需跳线)相匹配：
  //                    AIRange = 0，表示返回原码(0-4095)，所有卡都有这种方式
  //                    AIRange = 2，表示把原码值转化为 0 -- 10000mV 之间的值，如果此卡没有这种量程，不应选这种方式
  //                    AIRange = 5，表示把原码值转化为 -5000 -- 5000mV 之间的值，如果此卡没有这种量程，不应选这种方式
  //                    AIRange = 6，表示把原码值转化为 -10000 -- 10000mV 之间的值，如果此卡没有这种量程，不应选这种方式
  //           AIAmp：保留。保持此参数为0
  //      ADoverTime：设置超时时间，是一个毫秒数，一般设为60即可。若 ADoverTime = 0 表不检查AD超时
  //                  
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_EnableAD(unsigned long cardNO);
  //函数名称：ZT511PF_EnableAD
  //函数功能：允许AD。对于定时AD方式，等效于启动AD。
  //          注意：这个函数只是把AD方式恢复到调用 ZT511PF_AIinit 函数之后，
  //                调用 ZT511PF_DisableAD 函数之前的状态。
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_DisableAD(unsigned long cardNO);
  //函数名称：ZT511PF_DisableAD
  //函数功能：禁止AD。对于定时AD方式，等效于停止AD
  //          注意：在清硬件缓冲区(HFIFO)之前，应该先禁止AD，才能保证HFIFO真正清空
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_ClearHFifo(unsigned long cardNO);
  //函数名称：ZT511PF_ClearHFifo
  //函数功能：清硬件缓冲区(HFIFO)
  //          注意：在清硬件缓冲区(HFIFO)之前，应该先禁止AD，才能保证HFIFO真正清空
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_GetHFifoStatus(unsigned long cardNO);
  //函数名称：ZT511PF_GetHFifoStatus
  //函数功能：查询硬件缓冲区(HFIFO)状态
  //入口函数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //返回值：返回大于 0 的数表成功：
  //          0     表HFIFO空
  //          1     表HFIFO非空但不到半满
  //          2     表HFIFO达到或超过半满，但未到全满
  //          3     表HFIFO全满  
  //      其他数值  表未知状态，不应该出现  
  //        返回 -1表失败，函数调用失败时应进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_ReadHFifo(unsigned long cardNO,
                                         unsigned short *pResultArr,
                                         unsigned long readHFifoMode,
                                         unsigned long wantReadCount);
  //函数名称：ZT511PF_ReadHFifo
  //函数功能：从硬件缓冲区(HFIFO)中成批读数，可以指定读数的方式
  //          注意：这个函数适用于在一个循环中，连续不断地以查询方式成批读数
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //
  //         pResultArr：用户必须申请一个至少含有 wantReadCount 个unsigned short型元素的缓冲区，
  //                     用于存放采集结果，而 pResultArr 是这个缓冲区的首地址。
  //                     每个数据共占16个bits，其中低12位是AD原码值，高4位无意义
  //
  //      readHFifoMode：读硬件缓冲区(HFIFO)，允许用户指定读的方式
  //                     readHFifoMode = 0，表示读够用户指定数量的数据后，才返回
  //                     readHFifoMode = 1，表示先判断一下HFIFO状态，若为半满，就读4096个数，然后立刻返回
  //                     readHFifoMode = 2，表示只要读空HFIFO或达到用户指定的个数就可返回
  //
  //      wantReadCount：用户希望读出的数据个数，必须>0，且不能超过用户缓冲区的实际大小
  //                     当 readHFifoMode = 0 时，wantReadCount 可为大于0的任意数，当然也不能超过缓冲区的实际大小
  //                     当 readHFifoMode = 1 时，wantReadCount 必须大于等于4096
  //                     当 readHFifoMode = 2 时，wantReadCount 可设得大一些，一般大于8192
  //                    
  //返回值：  大于等于0  指明用户缓冲区中读到的有效数据的个数
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_AIHFifo(unsigned long cardNO,
                                       short *pResultArr,
                                       unsigned long readHFifoMode,
                                       unsigned long wantReadCount);
  //函数名称：ZT511PF_AIHFifo
  //函数功能：从硬件缓冲区(HFIFO)中成批读数，可以指定读数的方式。
  //          这个函数实际调用 ZT511PF_ReadHFifo 读数，然后根据先前调用 ZT511PF_AIinit 函数时
  //          设置的 AIRange 参数，把读到的结果转化到用户指定的量程上，
  //          如果 AIRange=0，则把读到的结果屏蔽掉高4位。
  //
  //          注意： 这个函数适用于在一个循环中，连续不断地以查询方式成批读数
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //
  //      pResultArr：用户必须申请一个至少含有 wantReadCount 个 short 型元素的缓冲区，
  //                    用于存放采集结果，而 pResultArr 是这个缓冲区的首地址。
  //
  //   readHFifoMode：读硬件缓冲区(HFIFO)，允许用户指定读的方式
  //                    readHFifoMode = 0，表示读够用户指定数量的数据后，才返回
  //                    readHFifoMode = 1，表示先判断一下HFIFO状态，若为半满，就读4096个数，然后立刻返回
  //                    readHFifoMode = 2，表示只要读空HFIFO或达到用户指定的个数就可返回
  //
  //   wantReadCount：用户希望读出的数据个数，必须>0，且不能超过缓冲区的实际大小
  //                    当 readHFifoMode = 0 时，wantReadCount 可为大于0的任意数，当然也不能超过缓冲区的实际大小
  //                    当 readHFifoMode = 1 时，wantReadCount 必须大于等于4096
  //                    当 readHFifoMode = 2 时，wantReadCount 可设得大一些，一般大于8192
  //                    
  //返回值：  大于等于0  指明缓冲区中读到的有效数据的个数
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_8255Mode(unsigned long cardNO,
                                        unsigned long chipNO,
                                        unsigned long n8255Mode);
  //函数名称：ZT511PF_8255Mode
  //函数功能：设置指定8255芯片的工作模式
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chipNO：芯片号固定为1
  //       n8255Mode：工作方式控制字节：
  //                    n8255Mode = 0x80 表示A,B,C口全设为输出工作方式
  //                    n8255Mode = 0x9B 表示A,B,C口全设为输入工作方式
  //                    n8255Mode = 0x83 表示A口及C口的高4位为输出方式；B口及C口的低4位为输入方式
  //                    n8255Mode = 0x89 表示A口及B口设为输出工作方式；C口设为输入工作方式
  //                    n8255Mode = 0x91 表示A口及C口低4位设为输入工作方式；B口及C口高4位设为输出工作方式
  //                    n8255Mode = 0x92 表示A口及B口设为输入工作方式；C口设为输出工作方式
  //                    其他方式由用户参考8255相关资料自行指定
  //                    注意：函数对此参数不作检查
  //返回值：   0      表示成功
  //          -1      表示失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_DIBit(unsigned long cardNO,
                                     unsigned long chipNO,
                                     unsigned long chNO);
  //函数名称：ZT511PF_DIBit
  //函数功能：得到指定8255芯片的某通道的开关量输入状态
  //          在调用之前，应该确保调用了 ZT511PF_8255Mode 函数设置了8255的工作方式
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chipNO：芯片号固定为1
  //            chNO：通道号(1--24)
  //返回值：
  //          0 表示低电平
  //          1 表示高电平
  //         -1 表示调用出错，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_DIAll(unsigned long cardNO,
                                     unsigned long chipNO);
  //函数名称：ZT511PF_DIAll
  //函数功能：得到指定8255芯片的所有通道的开关量输入状态
  //          在调用之前，应该确保调用了 ZT511PF_8255Mode 函数设置了8255的工作方式
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chipNO：芯片号固定为1
  //返回值：  返回指定8255芯片的所有通道的输入状态，当A,B,C口全设为输入工作方式时(0x9B)，返回0x00FFFFFF表所有通道输入为高电平
  //          若返回 -1 表示函数调用失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_DOBit(unsigned long cardNO,
                                     unsigned long chipNO,
                                     unsigned long chNO,
                                     unsigned long nState);
  //函数名称：ZT511PF_DOBit
  //函数功能：指定某8255芯片的某通道的开关量输出状态
  //          在调用之前，应该确保调用了 ZT511PF_8255Mode 函数设置了8255的工作方式
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chipNO：芯片号固定为1
  //            chNO：通道号(1--24)
  //          nState：指定某通道的开关量输出状态：
  //                    nState =    0    ，指定输出低电平
  //                    nState = 1(或非0)，指定输出高电平
  //返回值：  0      表示成功
  //         -1      表示失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_DOAll(unsigned long cardNO,
                                     unsigned long chipNO,
                                     unsigned long nStateAll);
  //函数名称：ZT511PF_DOAll
  //函数功能：指定某8255芯片的所有通道的开关量输出状态
  //          在调用之前，应该确保调用了 ZT511PF_8255Mode 函数设置了8255的工作方式
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chipNO：芯片号固定为1
  //       nStateAll：指定所有通道的开关量输出状态：
  //                     当A,B,C口全设为输出工作方式(0x80)时，
  //                     nStateAll = 0 表所有通道输出低电平
  //                     nStateAll = 0x00FFFFFF 表所有通道输出高电平
  //返回值：   0      表示成功
  //          -1      表示失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_DIPort(unsigned long cardNO,
                                      unsigned long chipNO,
                                      unsigned long portNO);
  //函数名称：ZT511PF_DIPort
  //函数功能：得到指定8255芯片的某个口的开关量输入状态，适用于最大DI通道号在 0--23 之间的卡
  //          在调用之前，应该确保调用了 ZT511PF_8255Mode 函数设置了8255的工作方式
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chipNO：芯片号固定为1
  //          portNO：口号(1-3)。1 = A口；2 = B口；3 = C口
  //返回值：  返回指定8255芯片的指定口的开关量输入状态，当指定口设为输入工作方式时，返回0xFF表这个口的所有通道输入为高电平
  //          若返回 -1 表示函数调用失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_DOPort(unsigned long cardNO,
                                      unsigned long chipNO,
                                      unsigned long portNO,
                                      unsigned long nState);
  //函数名称：ZT511PF_DOPort
  //函数功能：设置指定8255芯片的某个口的开关量输出状态，适用于最大DO通道号在 0--23 之间的卡
  //          在调用之前，应该确保调用了 ZT511PF_8255Mode 函数设置了8255的工作方式
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chipNO：芯片号固定为1
  //          portNO：口号(1-3)。1 = A口；2 = B口；3 = C口
  //          nState：指定口的输出状态：
  //                    当指定口设为输出工作方式时，
  //                    nState = 0表这个口的所有通道输出低电平
  //                    nState = 0xFF表这个口的所有通道输出高电平
  //返回值：  0      表示成功
  //         -1      表示失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_CTStart(unsigned long cardNO,
                                       unsigned long chNO,
                                       unsigned long nCTMode,
                                       unsigned long nCTinitVal);
  //函数名称：ZT511PF_CTStart
  //函数功能：设置指定8253/8254芯片的指定通道的工作方式及计数通道初值
  //          此时计数器是否开始计数，还取决于 Gate 端的状态，
  //          注意：从硬件的角度来说，只有当计数脉冲到来时，计数器初值才会被装入
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //            chNO：通道号：1--3
  //         nCTMode: 通道工作方式：0-5(工作方式只从0开始)
  //      nCTinitVal: 计数通道的初值(0--65535)
  //函数返回值：  0        成功
  //             -1        失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_CTRead(unsigned long cardNO,
                                      unsigned long chNO,
                                      unsigned long lockBeforeRead);
  //函数名称：ZT511PF_CTRead
  //函数功能：读取指定8253/8254芯片的指定计数通道的当前值(减法计数器)
  //          此函数不影响计数器的继续计数
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //            chNO：通道号：1--3
  //  lockBeforeRead：是否先封锁计数器再读值(一般不用封锁)：
  //                            0 = 不用先封锁再读
  //                            1 = 要先封锁再读
  //函数返回值：  返回计数器当前值
  //              若返回 -1 表示函数调用失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_CTStop(unsigned long cardNO,
                                      unsigned long chNO);
  //函数名称：ZT511PF_CTStop
  //函数功能：停止指定8253/8254芯片的指定通道工作
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //            chNO： 通道号：1--3
  //
  //返回值：  0  成功
  //         -1  失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_SetOCLKfreq(unsigned long cardNO, unsigned long OCLKfreq);
  //函数名称：ZT511PF_SetOCLKfreq
  //函数功能：设置内部时钟OCLK的输出频率。
  //          当采用定时AD方式时，OCLK频率等于AD采样频率。因此这个信号可作为多块板之间的同步信号
  //          当然如果采用定时AD方式时，不要设置这个时钟超过100K
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //        OCLKfreq：指定AD采样频率
  //                    板上自带的时钟默认为4M，实际是对这个时钟设置分频系数0~4095，
  //                    设 OCLKfreq = 0，表示停止 OCLK 输出。
  //                    由于分频后的时钟同时用于定时启动AD，所以当选择定时AD方式时，
  //                    不要设置这个时钟超过100K(AD最快只能到100K)，也就是不要使 OCLKfreq < 39。
  //                    
  //返回值：  0  成功
  //         -1  失败，应该进一步调用 ZT511PF_GetLastErr 函数查找出错原因
  ZT_API long _stdcall ZT511PF_AOinit(unsigned long cardNO,
                                      unsigned long chMode,
                                      unsigned long chNO,
                                      unsigned long AORange,
                                      unsigned long DAdelay);
  //函数名称：ZT511PF_AOinit
  //函数功能：用于连续成批DA前的初始化工作。
  //          也就是说，在第一次调用连续DA函数 ZT511PF_AO 之前，必须确保已调用过此函数
  //
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          chMode：通道方式
  //                    0 = 单通道
  //                    1 = 多通道循环输出方式
  //            chNO：通道号或多通道循环输出中止通道号
  //                    当 chMode = 0 时，为通道号(1--4)
  //                    当 chMode = 1 时，为多通道循环输出中止通道号(1-4)，例如设为2表示，输出的顺序为：通道1,通道2,通道1,通道2......
  //         AORange：函数根据这个参数把传入函数ZT511PF_AO的对应于第1个通道的DA值转化为对应的原码值(0-4095)。
  //                    之所以要转化，是因为向板卡的相应寄存器写入DA值时，必须是原码值。为了节省转化的时间，
  //                    建议用户直接向ZT511PF_AO函数传入原码值。注意：用户选择的输出范围还必须与硬件跳线相一致!
  //                    
  //                    AORange = 0，表示传入函数ZT511PF_AO的DA值已经是原码值，不需要转化
  //                    AORange = 1，表示传入函数ZT511PF_AO的DA值是 0 -- 5000mV 之间的值，需要转化为原码值
  //                                  如果此卡没有这种输出范围，不应选这种方式
  //                    AORange = 5，表示传入函数ZT511PF_AO的DA值是 -5000 -- 5000mV 之间的值，需要转化为原码值
  //                                  如果此卡没有这种输出范围，不应选这种方式
  //         DAdelay：在启动DA之后，需要的延时，最大不要超过10000。对于511PF可设为0
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_AO(unsigned long cardNO,
                                  short *pDAValueArr,
                                  unsigned long nCount);
  //函数名称：ZT511PF_AO
  //函数功能：软件启动DA方式时，尽可能快地做连续成批DA输出。
  //          把缓冲区pAOvalArr中的nCount个数据，从某个通道或从某几个通道输出(每个通道输出nCount/chNO个数)，
  //          chNO是在调用 ZT511PF_AOinit 时指定的。
  //            注意：1. 如果用户需要每次DA立刻生效，建议用这个函数。
  //                  2. 在第一次调用此函数之前，必须确保已调用过 ZT511PF_AOinit 函数
  //                  3. 缓冲区pAOvalArr中的数据必须是原码值，在调用这个函数之前应该先通过调用
  //                     ZT511PF_ChangeToInitCode 函数，把缓冲区中的数据转化为原码值
  //                  4. 因为这种方式不使用硬件缓冲区(HFIFO)，当用这个函数输出波形时，
  //                     在两次调用本函数的间隔期间，会产生波形中断的现象，属正常现象。
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //       pAOValArr：是一个含有至少 nCount 个unsigned short型元素的缓冲区(数组)的首地址，这个数组中存放的是要输出的值，
  //                    如果在调用 ZT511PF_AOinit 函数时指定参数 chMode = 1 且 chNO = 4 时，
  //                    那么在 pAOValArr 数组中放数的顺序应该是：
  //                      pAOValArr[0] = 通道1的第1个输出值，
  //                      pAOValArr[1] = 通道2的第1个输出值，
  //                      pAOValArr[2] = 通道3的第1个输出值，
  //                      pAOValArr[3] = 通道4的第1个输出值，
  //                      pAOValArr[4] = 通道1的第2个输出值，
  //                      pAOValArr[5] = 通道2的第2个输出值，
  //                      pAOValArr[6] = 通道3的第2个输出值，
  //                      pAOValArr[7] = 通道4的第2个输出值，...
  //          nCount：需要输出的次数，必须>0，并且不能超出缓冲区的长度
  //
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_AOonce(unsigned long cardNO,
                                      unsigned long chNO,
                                      unsigned long AORange,
                                      long nValue);
  //函数名称：ZT511PF_AOonce
  //函数功能：指定某通道模拟量输出一次
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //            chNO：通道号1--4(通道号默认从1开始)
  //         AORange：函数根据这个参数把nValue转化为对应的原码值(0-4095)
  //                    之所以要转化，是因为向板卡的相应寄存器写入DA值时，必须是原码值。
  //                    为了节省转化的时间，建议用户直接把 nValue 设为原码值。
  //                    注意：用户选择的输出范围还必须与硬件跳线相一致!
  //                    
  //                    AORange1 = 0，表示 nValue 已经是原码值，不需要转化
  //                    AORange1 = 1，表示 nValue 是 0 -- 5000mV 之间的值，需要转化为原码值
  //                                  如果此卡没有这种输出范围，不应选这种方式
  //                    AORange1 = 5，表示 nValue 是 -5000 -- 5000mV 之间的值，需要转化为原码值
  //                                  如果此卡没有这种输出范围，不应选这种方式
  //          nValue：要输出的值，例如当AORange = 1时，nValue=3000 表示输出3V
  //
  //返回值：  0  表成功
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
  ZT_API long _stdcall ZT511PF_ChangeToInitCode(unsigned long cardNO,
                                              long *pInArr,
                                              unsigned short *pOutArr,
                                              unsigned long arrSize);
  //函数名称：ZT511PF_ChangeToInitCode
  //函数功能：按照每个通道在调用 ZT511PF_AOinit 函数时选择的量程，把长整型数组转化为无符号短整型数组。
  //          这个函数的主要目的是：在调用 ZT511PF_AO 及 ZT511PF_WriteSFifo 之前，
  //          把用户存放长整型数据的缓冲区存放到无符号短整型缓冲区中，同时根据量程把数据转化
  //          为原码值。因为 ZT511PF_AO 及 ZT511PF_WriteSFifo 函数只接收原码值
  //          注意：1. 两个缓冲区都必须由用户在程序中申请
  //                2. arrSize 一定不能大于任何一个缓冲区的元素总数
  //入口参数：
  //          cardNO：板卡号默认从 1 开始，有关这个参数的详细说明，请参考 ZT511PF_OpenDevice 函数
  //          pInArr：用户提交的需要转换量程及转换数据类型的缓冲区的首地址，
  //                    注意：这个缓冲区必须由用户在程序中开辟，且元素个数必须大于等于 arrSize!
  //         pOutArr：用户用来接收转化后的数据的缓冲区的首地址，
  //                    注意：这个缓冲区也必须由用户在程序中开辟，且元素个数必须大于等于 arrSize!
  //         arrSize：用户希望转化的数据个数，必须>0，且不能超过两个用户缓冲区的实际大小
  //                    
  //返回值：  大于等于0  表缓冲区中读到的有效数据的个数
  //         -1  表失败，应该进一步调用 ZT511PF_GetLastErr 判断出错原因
}
#endif
